#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'liugenxian'
__mtime__ = '2017/3/11'
"""
"""
功能：多线程爬取会员的帖子，并存为html文件
1.获取cookie. 用document.cookie的方式，并把cookie字符串转换为dict
2.爬取指定会员的帖子，并存为文件
  * 2.1判断帖子是否存在，即会员是否发布过帖子，领取会员编号
  * 2.2获取该会员帖子的所有页的链接，每个会员只有一个帖子， 盖楼，超过20楼会多一个页面（如/t/555?page=2）
  * 2.3逐个链接获取页面内容
  * 2.4存取文件，先新建文件夹（会员号），在文件夹下存放html文件（20楼一个页面一个文件）
3.用多线程方式实现爬取所有会员帖子，按照会员号逐个建立线程进行爬取
  * 3.1建立所有会员号的列表
  * 3.2建立线程列表，给每个线程传递参数，并start
  * 3.3等待线程列表中的所有线程结束
"""

import os
import datetime
import re
import requests
from bs4 import BeautifulSoup
import threading

import logging
logging.basicConfig(level=logging.INFO)

def cookieStr_To_Dict(cookieStr):
    """
    将 document.cookie 获取的 cookie 字符串转换为字典形式 {cookie_name:cookie_value}
    :param: cookieStr
    :return: cookieDict
    """
    # 分割为新的列表，去掉'; '
    cookieStr = cookieStr.split('; ')
    # 定义正则式，将=两边分开，存为一个tuple
    name_value = re.compile(r'^(.*?)=(.*?)$')
    # 将每一个tuple的两个值转为key和value，存入dict, key为cookie的名字，value为cookie的值
    cookieDict = {}
    for item in cookieStr:
        cookieDict[name_value.match(item).groups()[0]] = name_value.match(item).groups()[1]

    return cookieDict

def storePosts(idMember, myCookie):
    """
    爬取指定会员的帖子，并存为html文件。
    :param: idMember 指定的会员号，如555
    :param: myCookie 我的cookie 字典形式
    :return:
    """
    site_url = r'http://qgc.qq.com'
    base_url = r'http://qgc.qq.com' + r'/314962432/t/'
    member_url = base_url + str(idMember)
    post_urls = [member_url]  # post_urls 为一个会员的帖子的全部页面的链接列表
    response = requests.get(member_url, cookies=myCookie)
    if response.status_code != requests.codes.ok:
        return False
    else:
        # "html.parser" 是 Python标准库 的 HTML 解析器
        # 对获取到的页面内容(response.content)进行解析
        soup = BeautifulSoup(response.content, "html.parser")

        # 找到名为class="page"的<div>标记, 在<div>内迭代所有<a>标记
        # 每个<a>里的<href>标记，即是需要找到的所有网页链接
        # 或直接找到 class=c_tx 的 <a> tag
        a_tag = soup.find_all(lambda tag: tag.name == 'a' and tag.get('class') == ['c_tx'])
        for a in a_tag:
            url = site_url + a.get('href')
            post_urls.append(url)

        return True

    directory = '[' + 'S' + str(idMember) + ']'
    # 如果目录不存在则创建，存在什么都不做
    if not os.path.exists(directory):
        os.makedirs(directory)

    # nowtime = re.sub(r'[^0-9]', '', str(datetime.datetime.now()))  # 文件加上当前时间，去掉了非数字的字符
    name = directory + '/' + 'page-'

    for index, urls in enumerate(post_urls):
        response = requests.get(urls, cookies=myCookie)
        # filename = name + str(index) + '-' + nowtime + '.html'
        filename = name + str(index) + '.html'
        with open(filename, 'wb') as fd:  # 'w' 如果文件存在，会先清空再写入，文件名加上当前时间后，不会重复了
            for chunk in response.iter_content(chunk_size=1024):
                fd.write(chunk)

if __name__=='__main__':
    myCookieStr = r"o_cookie=2822650346; pgv_info=pgvReferrer=&ssid=s1621300561; tvfe_boss_uuid=303f54fad5b0ed1a; pgv_pvid=8430805614; 314962432_2822650346_credit=%E5%8F%91%E8%A1%A8%E5%9B%9E%E5%A4%8D_1; webwx_data_ticket=gSdCcB2CnUHYcztP4KqXd3qc; security_cookiereport=1489218470; ptcz=d4d12a7cbcfb184a6659f5cb7a650a931914d0d013ece87ff6ee62679bc85dc6; pt2gguin=o2822650346; uin=o2822650346; skey=@bjJX9Ae2Z; ptisp=ctc; MANYOU_SESSIONID_bf895=27c1dd26b435653b66b9a1636cd90fc2; qqUser=%7B%22uin%22%3A2822650346%2C%22nickName%22%3A%22%5Cu51ac%5Cu5929%5Cu7684%5Cu70b9%5Cu70b9%22%7D; uniqueuid=5b0ff44903734ca1ebfe7cd0fecb4c8a"
    myCookie = cookieStr_To_Dict(myCookieStr)
    # storePosts(555, myCookie)
    thread_list = []
    idMember_list = range(9, 100)
    for index, idMember in enumerate(idMember_list):
        t = threading.Thread(target=storePosts, args=(idMember, myCookie))
        thread_list.append(t)
        t.start()
    for nthread in thread_list:
        nthread.join()